package com.saydc.forms.puestos.especifico;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

import com.saydc.dao.PuestosDAO;
import com.saydc.model.Puesto;

public class ActualizaPuestoEspecificoForm extends ActionForm {
	
	private static final long serialVersionUID = 1L;
	private String nombre;
	private int puestoGenerico;
	private String remMinima;
	private String remMaxima;
	private int unidadOrganizativa;
	private int[] seleccionados;
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public int getPuestoGenerico() {
		return puestoGenerico;
	}
	public void setPuestoGenerico(int puestoGenerico) {
		this.puestoGenerico = puestoGenerico;
	}
	public String getRemMinima() {
		return remMinima;
	}
	public void setRemMinima(String remMinima) {
		this.remMinima = remMinima;
	}
	public String getRemMaxima() {
		return remMaxima;
	}
	public void setRemMaxima(String remMaxima) {
		this.remMaxima = remMaxima;
	}
	public int getUnidadOrganizativa() {
		return unidadOrganizativa;
	}
	public void setUnidadOrganizativa(int unidadOrganizativa) {
		this.unidadOrganizativa = unidadOrganizativa;
	}
	public int[] getSeleccionados() {
		return seleccionados;
	}
	public void setSeleccionados(int[] seleccionados) {
		this.seleccionados = seleccionados;
	}
	
	@Override
	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		if(nombre == null || nombre.length() < 1){
			errors.add("nombrePuesto", new ActionMessage("error.altaPuesto.nombre"));
		}
		if(puestoGenerico == -1){
			errors.add("puestoGenerico", new ActionMessage("error.altaPuesto.puestoGenerico"));
		}
		if(unidadOrganizativa == -1){
			errors.add("unidadOrganizativa", new ActionMessage("error.altaPuesto.unidadOrganizativa"));
		}
		if(remMinima == null || numeroValido(remMinima) == false){
			errors.add("remMinima", new ActionMessage("error.altaPuesto.remMinima"));
		}
		if(remMaxima == null || numeroValido(remMaxima) == false){
			errors.add("remMinima", new ActionMessage("error.altaPuesto.remMaxima"));
		}
		if((numeroValido(remMinima) && numeroValido(remMaxima)) && validaIntervalo(remMinima, remMaxima) == false){
			errors.add("errorIntervalo", new ActionMessage("error.altaPuesto.intervalo"));
		}
		PuestosDAO dao = PuestosDAO.getInstance();
		if(isEnIntervaloPuesto(dao.getPuesto(puestoGenerico), remMinima, remMaxima) == false){
			errors.add("remuneracionIntervalo", new ActionMessage("error.altaPuesto.intervaloRemuneracion"));
		}
		if(seleccionados == null){
			errors.add("selectedVacio", new ActionMessage("error.altaPuesto.expertisesVacio"));
		}
		return errors;
	}
	
	private boolean numeroValido(String valor){
		double numero = 0d;
		try{
			numero = Double.parseDouble(valor);
		}catch(Exception e){
			return false;
		}
		if(numero == 0){
			return false;
		}
		return true;
	}
	
	private boolean validaIntervalo(String remMinima, String remMaxima) {
		double minima = 0d;
		double maxima = 0d;
		try{
			minima = Double.parseDouble(remMinima);
			maxima = Double.parseDouble(remMaxima);
			if(minima >= maxima){
				return false;
			}
		}catch(Exception e){
			return false;
		}
		return true;
	}
	
	private boolean isEnIntervaloPuesto(Puesto puesto, String remMinima, String remMaxima){
		double minima = Double.parseDouble(remMinima);
		double maxima = Double.parseDouble(remMaxima);
		if(minima < puesto.getRemuneracionMinima() || maxima > puesto.getRemuneracionMaxima()){
			return false;
		}
		return true;
	}
	
}
